package tum0r.webengine.core.handle

import tum0r.webengine.config.ApplicationConfig
import tum0r.webengine.models.core.Action

/**
 * 说明: 请求过滤基类
 *
 * 创建者: tum0r
 *
 * 时间: 2021/8/21 20:14
 *
 * @param[filterName] 规则集合名称
 */
abstract class Filter(val filterName: String) {

    /**
     * 使用默认规则名称 "过滤规则"+规则条数
     */
    constructor() : this("过滤规则${ApplicationConfig.FILTERS.size}")

    /**
     * 需要过滤的路径
     */
    private var requestPath = ArrayList<String>()

    /**
     * 添加过滤路径
     *
     * @param[requestPath] 需要被过滤的请求路径
     */
    fun addRequestPath(vararg requestPath: String) {
        for (path in requestPath) {
            if (!this.requestPath.contains(path)) {
                if (path.isBlank()) this.requestPath.add("/*")
                else this.requestPath.add(path)
            }
        }
    }

    /**
     * 比对请求地址，看是否需要过滤
     *
     * @param requestURL 请求地址
     *
     * @return 为true则需要过滤
     */
    fun equalsRequestURL(requestURL: String): Boolean {
        if (requestURL.isEmpty()) return false
        var result = false
        for (tempRequestPath in this.requestPath) {
            val temp1 = tempRequestPath.split("/".toRegex()).toTypedArray()
            val temp2 = requestURL.split("/".toRegex()).toTypedArray()
            if (temp1.size <= temp2.size) {
                result = true
                for (i in temp1.indices) {
                    if (temp1[i] != temp2[i] && temp1[i] != "*") {
                        result = false
                        break
                    }
                }
            }
        }
        return result
    }

    /**
     * 对请求进行过滤
     *
     * @param action 请求的信息
     *
     * @return true为放行，false为抛出错误
     */
    abstract fun filter(action: Action<Any>): Boolean

    /**
     * 抛出的错误信息
     *
     * @return 错误信息
     */
    abstract fun message(): String
}